树与图的深度优先遍历(总结向,dfs序,深度和重心)

8 篇文章 0 订阅
2 篇文章 0 订阅

dfs

1

void dfs(int x)
{
    vis[x] = 1;
    for(int i = head[x];i;i = next[i])
    {
        int y = ver[i];
        if(vis[y])
            continue;
        dfs(y);
    }
}

2

VI e[maxn];
void dfs(int u)
{
    vis[u] = 1;
    for(auto &v:e[u])
    {
        if(!vis[v])
        {
            dfs(v);
        }
    }
}

树的dfs序

就是递归后和回溯前记录一次该点的编号

1

void dfs(int x)
{
    a[++m] = x;
    vis[x] = 1;
    for(int i = head[x];i;i = next[i])
    {
        int y = ver[i];
        if(vis[y])
            continue;
        dfs(y);
    }
    a[++m] = x;
}

2

void dfs(int u)
{
    a[++m] = u;
    vis[u] = 1;
    for(auto &v : e[u])
    {
        if(!vis[v])
        {
            dfs(v);
        }
    }
    a[++m] = u;
}

树的深度

根节点的深度为0,若节点 x x 的深度为d[x],那么子节点 y y 的深度为d[y]=d[x]+1;

1

void dfs(int x)
{
    vis[x] = 1;
    for(int i = head[x];i;i = next[i])
        {
            int y = ver[x];
            if(vis[y]) continue;
            d[y] = d[x] + 1;
            dfs(y);
        }
}

2

void dfs(int u)
{
    vis[u] = 1;
    for(auto &v : e[u])
    {
        if(!vis[v])
        {
            d[v] = d[u] + 1;
            dfs(v);
        }
    }
}

树的重心

自底向下统计,以节点 x x 为根的子树大小为size[x],节点 x x k个节点 y1,y2,...,yk y 1 , y 2 , . . . , y k , size[x]=size[y1]+size[y2]+...+size[yk]+1 s i z e [ x ] = s i z e [ y 1 ] + s i z e [ y 2 ] + . . . + s i z e [ y k ] + 1 ;
对于一个节点,如果我们将它删去,那么一棵树可能分成若干个子树,设 max m a x part(x) p a r t ( x ) 为删去节点后产生的最大的一棵子树的大小。使 max m a x part(x) p a r t ( x ) 取最小值的节点 p p <script type="math/tex" id="MathJax-Element-1563">p</script>为重心

1

void dfs(int x)
{
    vis[x] = 1;
    size[x] = 1;
    int ma = 0;
    for(int i = head[x];i;i = next[i])
    {
        int y = ver[i];
        if(vis[y]) continue;
        dfs(y);
        size[x] += size[y];
        ma = max(ma,size[y]);
    }
    ma = max(ma,n - size[x]);
    if(ma < ans)
    {
        ans = ma;//重心对应的maxpart值
        pos = x;//重心位置
    }
}

2

void dfs(int u)
{
    vis[u] = 1;
    size[u] = 1;
    int ma = 0;
    for(auto &v : e[u])
    {
        if(!vis[v])
        {
            dfs(v);
            size[u] += size[v];
            ma = max(ma,size[v]);
        }
    }
    ma = max(ma,n - size[x]);
    if(ma < ans)
    {
        ans = ma;
        pos = x;
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是无向深度优先遍历和广度优先遍历的介绍和演示: 1.深度优先遍历DFS): 深度优先遍历是一种用于遍历或搜索的算法。在这种搜索方法中,从根结点开始,尽可能深地搜索每个分支,直到找到目标值或无法继续为止。然后回溯到前一个结点,尝试另一条分支,直到所有结点都被访问为止。 以下是一个无向深度优先遍历的Python代码示例: ```python # 无向深度优先遍历 def DFS(graph, start, visited=None): if visited is None: visited = set() visited.add(start) print(start, end=' ') for next in graph[start] - visited: DFS(graph, next, visited) return visited # 无向的邻接表表示 graph = {'A': set(['B', 'C']), 'B': set(['A', 'D', 'E']), 'C': set(['A', 'F']), 'D': set(['B']), 'E': set(['B', 'F']), 'F': set(['C', 'E'])} # 从顶点A开始遍历 print("深度优先遍历结果:") DFS(graph, 'A') ``` 输出结果为:A B D E F C 2.广度优先遍历(BFS): 广度优先遍历是一种用于遍历或搜索的算法。在这种搜索方法中,从根结点开始,逐层遍历每个分支,直到找到目标值或无法继续为止。 以下是一个无向的广度优先遍历的Python代码示例: ```python # 无向的广度优先遍历 def BFS(graph, start): visited, queue = set(), [start] visited.add(start) while queue: vertex = queue.pop(0) print(vertex, end=' ') for next in graph[vertex] - visited: visited.add(next) queue.append(next) # 无向的邻接表表示 graph = {'A': set(['B', 'C']), 'B': set(['A', 'D', 'E']), 'C': set(['A', 'F']), 'D': set(['B']), 'E': set(['B', 'F']), 'F': set(['C', 'E'])} # 从顶点A开始遍历 print("广度优先遍历结果:") BFS(graph, 'A') ``` 输出结果为:A B C D E F

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值